/**
 * @file    bsp_delay.c
 * @brief   延时函数模块
 */

/*-------------------------- 头文件包含 ----------------------------*/

#include "bsp_delay.h"
#include "stm32f4xx.h"

/*-------------------------- 私有宏定义-----------------------------*/

/*-------------------------- 私有类型定义 --------------------------*/

/*-------------------------- 静态全局变量 --------------------------*/

uint32_t g_ticks = 0;

/*-------------------------- 私有函数声明 --------------------------*/

/*-------------------------- 公有函数实现 --------------------------*/

/**
 * @brief 配置 TIM6 定时器
 * @param 无
 * @retval 无
 */
void bspDelayInit(void)
{
    // 时钟使能 TIM6
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

    // 时基单元初始化
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

    // NVIC 初始化
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = TIM6_DAC_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);
    TIM_Cmd(TIM6, ENABLE);
}

/**
 * @brief   毫秒延时函数
 * @param
 * @arg ms: 延时的毫秒数
 * @retval 无
 * @attention 单位为 1ms
 */
void bspDelay_ms(uint32_t ms)
{
    uint32_t timeout = g_ticks + ms;

    while (g_ticks < timeout)
    {
    }
}

// 毫秒延时经宏定义实现，见 delay.h

/*-------------------------- 私有函数实现 --------------------------*/

/**
 * @brief   时间衰减函数
 * @param void
 * @retval void
 * @attention 由中断调用
 */
void timeIncrease(void)
{
    g_ticks++;
    // if (g_ticks == 0)
    // {
    //     g_ticks = 1;
    // }
    // else
    // {
    //     g_ticks = 0;
    // }
}